﻿using System;
using System.Collections;
using ApplicationGenerator.BusinessModule.Interfaces;

namespace ApplicationGenerator.BusinessModule.MetaElements
{
    /// <summary>
    /// Kolekcja definicji metamodeli
    /// </summary>
    internal class MetaModelCollection : DictionaryBase, IMetaModelCollection
    {
        /// <summary>
        /// Dodaje metamodel do kolekcji
        /// </summary>
        /// <param name="metaAdapter">Metamodel</param>
        public void Add(IMetaModel metaAdapter)
        {
            try
            {
                Dictionary.Add(metaAdapter.ModelName, metaAdapter);
            }
            catch
            {
                throw new ArgumentException("Nie można zarejestrować w kolekcji modeli o takich samych nazwach.");
            }
        }

        /// <summary>
        /// Sprawdza, czy kolekcja zawiera metamodel
        /// </summary>
        /// <param name="metaModelName">Nazwa metamodelu</param>
        /// <returns>Czy kolekcja zawiera metamodel ?</returns>
        public bool Contains(string metaModelName)
        {
            return Dictionary.Contains(metaModelName);
        }

        /// <summary>
        /// Pobiera metamodel z kolekcji
        /// </summary>
        /// <param name="metaModelName">Nazwa metamodelu</param>
        /// <returns>Metamodel</returns>
        public IMetaModel this[string metaModelName]
        {
            get { return Dictionary[metaModelName] as IMetaModel; }
        }

        /// <summary>
        /// Pobiera nazwy metamodeli
        /// </summary>
        /// <returns>Kolekcja nazw metamodeli</returns>
        public ICollection GetMetaModelNames()
        {
            return Dictionary.Keys;
        }


        #region IEnumerable Members

        /// <summary>
        /// Pobiera enumerator dla kolekcji
        /// </summary>
        /// <returns>Enumerator</returns>
        public new IEnumerator GetEnumerator()
        {
            return Dictionary.Values.GetEnumerator();
        }

        #endregion
    }
}
